import { DD_SYSTEM } from '@/constants/api-pre';
import { request } from '@/service/request';

/** OAuth2 客户端 */
export type OAuth2Client = Api.Common.CommonRecord<{
  /** 客户端编号 */
  clientId: string;
  /** 客户端密钥 */
  clientSecret: string;
  /** 应用名 */
  clientName: string;
  /** 客户端发布时间 */
  clientIdIssuedAt: Date;
  /** 密钥有效期 */
  clientSecretExpiresAt: Date | null;
  /** 客户端身份验证方法 */
  clientAuthenticationMethods: string;
  /** 授权类型 */
  authorizationGrantTypes: string[];
  /** 重定向地址 */
  redirectUris: string;
  /** 登出重定向地址 */
  postLogoutRedirectUris: string;
  /** 授权范围 */
  scopes: string;
  /** 应用图标 */
  clientLogo: string;
  /** 应用描述 */
  clientDescription: string;
  /** Token 有效期（单位 s） */
  accessTokenTimeToLive: number;
  /** Refresh Token 有效期（单位 s） */
  refreshTokenTimeToLive: number;
}>;

/** OAuth2 客户端 search params */
export type OAuth2ClientSearchParams = CommonType.RecordNullable<
  Pick<OAuth2Client, 'clientName' | 'status'> & Api.Common.CommonSearchParams
>;

export type OAuth2ClientEditAndCreateParams = CommonType.RecordNullable<Exclude<OAuth2Client, 'clientIdIssuedAt'>>;

/** OAuth2 客户端 list */
export type OAuth2ClientList = Api.Common.PaginatingQueryRecord<OAuth2Client>;

/** 获取OAuth2 客户端 URL */
export function getFetchOAuth2ClientUrl(id: number) {
  return `${DD_SYSTEM}/oauth2-client/${id}/form`;
}

/** 获取OAuth2 客户端列表 */
export function fetchGetOAuth2ClientList(params?: OAuth2ClientSearchParams) {
  return request<OAuth2ClientList>({
    url: `${DD_SYSTEM}/oauth2-client/page`,
    method: 'get',
    params
  });
}

/**
 * 新增OAuth2 客户端
 *
 * @param data
 */
export function createOAuth2Client(data: OAuth2ClientEditAndCreateParams) {
  return request<boolean>({
    url: `${DD_SYSTEM}/oauth2-client`,
    method: 'post',
    data
  });
}

/**
 * 修改OAuth2 客户端
 *
 * @param id
 * @param data
 */
export function updateOAuth2Client(id: number, data?: OAuth2ClientEditAndCreateParams) {
  return request<boolean>({
    url: `${DD_SYSTEM}/oauth2-client/${id}`,
    method: 'put',
    data
  });
}

/**
 * 删除OAuth2 客户端
 *
 * @param ids
 */
export function deleteOAuth2Client(ids: string) {
  return request<boolean>({
    url: `${DD_SYSTEM}/oauth2-client/${ids}`,
    method: 'delete'
  });
}

/** OAuth2 客户端 */
export type OAuth2Token = Api.Common.CommonRecord<{
  /** 客户端编号 */
  clientId: string;
  /** 访问令牌 */
  accessToken: string;
  /** 刷新令牌 */
  refreshToken: string;
  /** 用户名 */
  username: string;
  /** 令牌发布时间 */
  accessTokenIssuedAt: Date | null;
  /** 令牌过期时间 */
  accessTokenExpiresAt: Date | null;
  /** 授权类型 */
  authorizationGrantType: string;
}>;

/** OAuth2 客户端 Token list */
export type OAuth2TokenList = Api.Common.PaginatingQueryRecord<OAuth2Token>;

/** OAuth2 客户端 Token search params */
export type OAuth2TokenSearchParams = CommonType.RecordNullable<
  Pick<OAuth2Token, 'username' | 'authorizationGrantType' | 'clientId'> & Api.Common.CommonSearchParams
>;

/** 获取 OAuth2 客户端 Token 列表 */
export function fetchGetOAuth2TokenList(params?: OAuth2TokenSearchParams) {
  return request<OAuth2TokenList>({
    url: `${DD_SYSTEM}/oauth2-token/page`,
    method: 'get',
    params
  });
}
